package com.mall4j.cloud.common;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author wukai
 * @date 2022/2/25 14:27
 */
public class ReadWriteDemo {
    public static void main(String[] args) {
        // ReadWriteLock接口，读写锁，读与读不互斥，读与写互斥，写与写互斥
        // ReentrantReadWriteLock 可重入读写锁，实现类,可重入，同一线程可以获取多次锁
        // 1.Java并发库中ReetrantReadWriteLock实现了ReadWriteLock接口并添加了可重入的特性
        //2.ReetrantReadWriteLock读写锁的效率明显高于synchronized关键字
        //3.ReetrantReadWriteLock读写锁的实现中，读锁使用共享模式；写锁使用独占模式，换句话说，读锁可以在没有写锁的时候被多个线程同时持有，写锁是独占的
        //4.ReetrantReadWriteLock读写锁的实现中，需要注意的，当有读锁时，写锁就不能获得；而当有写锁时，除了获得写锁的这个线程可以获得读锁外，其他线程不能获得读锁
        ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        new Thread(()->{
            readWriteLock.writeLock();
            System.out.println("子线程 写");
        }).start();

        readWriteLock.readLock().lock();

        System.out.println("主线程 read");

        //readWriteLock.readLock().unlock();
    }
}
